Įvaldykite JavaScript saugą su šiuo išsamiu vadovu. Išmokite įdiegti patikimą saugos infrastruktūrą, apimančią CSP, CORS, saugų programavimą, autentifikavimą ir kt.
Skaitmeninės Tvirtovės Statyba: Išsamus Vadovas, Kaip Įdiegti JavaScript Saugos Infrastruktūrą
Šiuolaikinėje skaitmeninėje ekosistemoje JavaScript yra neginčijama žiniatinklio lingua franca. Ji maitina viską – nuo dinamiškų vartotojo sąsajų kliento pusėje iki patikimų, didelio našumo serverių užpakalinėje dalyje. Tačiau dėl šio visur esančio reiškinio JavaScript programos tampa pagrindiniu piktavalių veikėjų taikiniu. Vienas pažeidžiamumas gali sukelti niokojančių pasekmių, įskaitant duomenų pažeidimus, finansinius nuostolius ir reputacijos žalą. Vien tik funkcionalaus kodo rašymas nebėra pakankamas; patikimos, atsparios saugos infrastruktūros kūrimas yra neprivalomas reikalavimas bet kuriam rimtam projektui.
Šis vadovas pateikia išsamų, į įgyvendinimą orientuotą žingsnis po žingsnio procesą, kaip sukurti modernią JavaScript saugos infrastruktūrą. Mes išeisime už teorinių koncepcijų ribų ir pasinersime į praktinius veiksmus, įrankius ir geriausią praktiką, reikalingą jūsų programoms sustiprinti nuo pat pradžių. Nesvarbu, ar esate priekinės dalies kūrėjas, užpakalinės dalies inžinierius ar pilno paketo specialistas, šis vadovas suteiks jums žinių, kad galėtumėte pastatyti skaitmeninę tvirtovę aplink savo kodą.
Šiuolaikinio JavaScript Grėsmių Lauko Supratimas
Prieš statydami savo gynybą, pirmiausia turime suprasti, nuo ko ginamės. Grėsmių laukas nuolat kinta, tačiau keli pagrindiniai pažeidžiamumai išlieka paplitę JavaScript programose. Sėkminga saugos infrastruktūra turi sistemingai spręsti šias grėsmes.
- Tarpvietinių Scenarijų Vyksmas (XSS): Tai galbūt labiausiai žinomas žiniatinklio pažeidžiamumas. XSS įvyksta, kai užpuolikas įterpia kenkėjiškus scenarijus į patikimą svetainę. Tada šie scenarijai vykdomi aukos naršyklėje, leidžiant užpuolikui pavogti seanso prieigos raktus, nugramdyti neskelbtinus duomenis arba atlikti veiksmus vartotojo vardu.
- Tarpvietinių Užklausų Padirbinėjimas (CSRF): CSRF atakos metu užpuolikas apgaule priverčia prisijungusį vartotoją pateikti kenkėjišką užklausą žiniatinklio programai, su kuria jis yra autentifikuotas. Tai gali sukelti neteisėtus būsenos keitimo veiksmus, pvz., pakeisti el. pašto adresą, pervesti lėšas arba ištrinti paskyrą.
- Tiekimo Grandinės Atakos: Šiuolaikinis JavaScript kūrimas labai priklauso nuo atvirojo kodo paketų iš registrų, tokių kaip npm. Tiekimo grandinės ataka įvyksta, kai piktavalis veikėjas pažeidžia vieną iš šių paketų, įterpdamas kenkėjišką kodą, kuris vėliau vykdomas kiekvienoje jį naudojančioje programoje.
- Nesaugus Autentifikavimas ir Autorizacija: Silpnybės, susijusios su vartotojų identifikavimu (autentifikavimu) ir tuo, ką jiems leidžiama daryti (autorizacija), gali suteikti užpuolikams neteisėtą prieigą prie neskelbtinų duomenų ir funkcijų. Tai apima silpnas slaptažodžių politiką, netinkamą seansų valdymą ir pažeistą prieigos kontrolę.
- Neskelbtinų Duomenų Atskleidimas: Neskelbtinos informacijos, pvz., API raktų, slaptažodžių arba asmeninių vartotojo duomenų, atskleidimas kliento pusės kode, per nesaugias API galines jungtis arba žurnaluose, yra labai svarbus ir dažnas pažeidžiamumas.
Šiuolaikinės JavaScript Saugos Infrastruktūros Ramstis
Išsami saugos strategija nėra vienas įrankis ar technika, o daugiasluoksnis gynybos gylio požiūris. Savo infrastruktūrą galime suskirstyti į šešis pagrindinius ramsčius, kurių kiekvienas sprendžia skirtingą programos saugos aspektą.
- Naršyklės Lygmens Gynyba: Šiuolaikinių naršyklių saugos funkcijų panaudojimas kuriant galingą pirmąją gynybos liniją.
- Programos Lygmens Saugus Programavimas: Kodo rašymas, kuris iš prigimties yra atsparus įprastoms atakų vektoriams.
- Patikimas Autentifikavimas ir Autorizacija: Saugus vartotojo tapatybės ir prieigos kontrolės valdymas.
- Saugus Duomenų Tvarkymas: Duomenų apsauga tiek perduodant, tiek ilsintis.
- Priklausomybių ir Kūrimo Vamzdyno Saugumas: Programinės įrangos tiekimo grandinės ir kūrimo gyvavimo ciklo apsauga.
- Žurnalų kūrimas, stebėjimas ir reagavimas į incidentus: Saugos įvykių aptikimas, reagavimas į juos ir mokymasis iš jų.
Išnagrinėkime, kaip išsamiai įgyvendinti kiekvieną iš šių ramsčių.
1 Ramstis: Naršyklės Lygmens Gynybos Įgyvendinimas
Šiuolaikinėse naršyklėse yra galingų saugos mechanizmų, kuriuos galite valdyti per HTTP antraštes. Teisingas jų konfigūravimas yra vienas iš efektyviausių veiksmų, kurių galite imtis norėdami sušvelninti įvairias atakas, ypač XSS.
Turinio Saugos Politika (CSP): Jūsų Pagrindinė Gynyba Prieš XSS
Turinio saugos politika (CSP) yra HTTP atsako antraštė, leidžianti nurodyti, kuriuos dinaminius išteklius (scenarijus, stilių lapus, vaizdus ir t. t.) naršyklė gali įkelti. Ji veikia kaip baltasis sąrašas, veiksmingai neleidžiant naršyklei vykdyti užpuoliko įterptų kenkėjiškų scenarijų.
Įgyvendinimas:
Jūsų tikslas yra griežta CSP. Gera atspirties taškas atrodo taip:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' https://api.yourapp.com; frame-ancestors 'none'; report-uri /csp-violation-report-endpoint;
Išskaidykime šias direktyvas:
default-src 'self'
: Pagal numatytuosius nustatymus leiskite įkelti išteklius tik iš tos pačios kilmės (jūsų pačių domeno).script-src 'self' https://trusted-cdn.com
: Leiskite scenarijus tik iš savo domeno ir patikimo turinio pristatymo tinklo.style-src 'self' 'unsafe-inline'
: Leiskite stilių lapus iš savo domeno. Pastaba:'unsafe-inline'
dažnai reikalingas senesniam CSS, tačiau reikėtų vengti, jei įmanoma, pertvarkant įdėtuosius stilius.img-src 'self' data:
: Leiskite vaizdus iš savo domeno ir iš duomenų URI.connect-src 'self' https://api.yourapp.com
: Apriboja AJAX/Fetch užklausas tik jūsų domenu ir konkrečia API galine jungtimi.frame-ancestors 'none'
: Neleidžia įdėti jūsų svetainės į<iframe>
, sušvelninant spustelėjimų atakas.report-uri /csp-violation-report-endpoint
: Nurodo naršyklei, kur siųsti JSON ataskaitą, kai pažeidžiama politika. Tai labai svarbu norint stebėti atakas ir patikslinti savo politiką.
Patarimas: Venkite 'unsafe-inline'
ir 'unsafe-eval'
, skirtų script-src
bet kokia kaina. Norėdami saugiai tvarkyti įdėtuosius scenarijus, naudokite nonce pagrįstą arba maišos pagrįstą metodą. Nonce yra unikalus, atsitiktinai sugeneruotas prieigos raktas kiekvienai užklausai, kurią įtraukiate į CSP antraštę ir scenarijaus žymą.
Tarpvietinių Išteklių Bendrinimas (CORS): Prieigos Kontrolės Valdymas
Pagal numatytuosius nustatymus naršyklės taiko tos pačios kilmės politiką (SOP), kuri neleidžia tinklalapiui pateikti užklausų kitam domenui nei tas, kuris aptarnavo puslapį. CORS yra mechanizmas, kuris naudoja HTTP antraštes, kad serveris galėtų nurodyti bet kokias kitas kilmes nei savo, iš kurių naršyklė turėtų leisti įkelti išteklius.Įgyvendinimas (Node.js/Express pavyzdys):
Niekada nenaudokite pakaitos simbolio (*
) Access-Control-Allow-Origin
gamybinėse programose, kurios tvarko neskelbtinus duomenis. Vietoj to, palaikykite griežtą leidžiamų kilmių baltąjį sąrašą.
const cors = require('cors');
const allowedOrigins = ['https://yourapp.com', 'https://staging.yourapp.com'];
const corsOptions = {
origin: function (origin, callback) {
if (allowedOrigins.indexOf(origin) !== -1 || !origin) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
credentials: true // Important for handling cookies
};
app.use(cors(corsOptions));
Papildomos Saugos Antraštės Grūdinimui
- HTTP Griežtas Transporto Saugumas (HSTS):
Strict-Transport-Security: max-age=31536000; includeSubDomains
. Tai nurodo naršyklėms bendrauti su jūsų serveriu tik per HTTPS, užkertant kelią protokolo atnaujinimo atakoms. - X-Content-Type-Options:
X-Content-Type-Options: nosniff
. Tai neleidžia naršyklėms MIME-šnipinėti atsakymo toli nuo deklaruoto turinio tipo, o tai gali padėti išvengti tam tikrų XSS atakų tipų. - Referrer-Policy:
Referrer-Policy: strict-origin-when-cross-origin
. Tai kontroliuoja, kiek siuntėjo informacijos siunčiama su užklausomis, užkertant kelią galimiems duomenų nutekėjimams URL.
2 Ramstis: Programos Lygmens Saugaus Programavimo Praktika
Net ir turint stiprią naršyklės lygmens gynybą, pažeidžiamumų gali atsirasti dėl nesaugių programavimo modelių. Saugus programavimas turi būti pagrindinė kiekvieno kūrėjo praktika.
XSS Prevencija: Įvesties Sanitarija ir Išvesties Kodavimas
Pagrindinė taisyklė, kaip išvengti XSS, yra: niekada nepasitikėkite vartotojo įvestimi. Visi duomenys, gauti iš išorinio šaltinio, turi būti tvarkomi atsargiai.
- Įvesties Sanitarija: Tai apima vartotojo įvesties valymą arba filtravimą, kad būtų pašalinti galimai kenkėjiški simboliai arba kodas. Norėdami gauti raiškųjį tekstą, naudokite tvirtą biblioteką, skirtą šiam tikslui.
- Išvesties Kodavimas: Tai yra pats svarbiausias žingsnis. Atvaizduodami vartotojo pateiktus duomenis savo HTML, turite juos užkoduoti konkrečiam kontekstui, kuriame jie bus rodomi. Šiuolaikiniai priekinės dalies karkasai, tokie kaip React, Angular ir Vue, tai daro automatiškai didžiajai daliai turinio, tačiau turite būti atsargūs naudodami tokias funkcijas kaip
dangerouslySetInnerHTML
.
Įgyvendinimas (DOMPurify sanitarijai):
Kai turite leisti šiek tiek HTML iš vartotojų (pvz., tinklaraščio komentarų skiltyje), naudokite tokią biblioteką kaip DOMPurify.
import DOMPurify from 'dompurify';
let dirtyUserInput = '<img src="x" onerror="alert('XSS')">';
let cleanHTML = DOMPurify.sanitize(dirtyUserInput);
// cleanHTML will be: '<img src="x">'
// The malicious onerror attribute is removed.
document.getElementById('content').innerHTML = cleanHTML;
CSRF Sušvelninimas naudojant Sinchronizatoriaus Apieškos Modelį
Tvirtiausia gynyba prieš CSRF yra sinchronizatoriaus apieškos modelis. Serveris sugeneruoja unikalų, atsitiktinį prieigos raktą kiekvienam vartotojo seansui ir reikalauja, kad šis prieigos raktas būtų įtrauktas į bet kurią būseną keičiančią užklausą.
Įgyvendinimo Koncepcija:
- Kai vartotojas prisijungia, serveris sugeneruoja CSRF prieigos raktą ir saugo jį vartotojo seanse.
- Serveris įterpia šį prieigos raktą į paslėptą įvesties lauką formose arba pateikia jį kliento pusės programai per API galinę jungtį.
- Kiekvienai būseną keičiančiai užklausai (POST, PUT, DELETE) klientas turi atsiųsti šį prieigos raktą atgal, paprastai kaip užklausos antraštę (pvz.,
X-CSRF-Token
) arba užklausos turinyje. - Serveris patikrina, ar gautas prieigos raktas atitinka tą, kuris saugomas seanse. Jei jis neatitinka arba jo nėra, užklausa atmetama.
Tokios bibliotekos kaip csurf
, skirtos Express, gali padėti automatizuoti šį procesą.
3 Ramstis: Patikimas Autentifikavimas ir Autorizacija
Saugus valdymas, kas gali pasiekti jūsų programą ir ką jie gali daryti, yra esminis saugumo aspektas.
Autentifikavimas su JSON Žiniatinklio Prieigos Raktais (JWT)
JWT yra populiarus prieigos raktų kūrimo standartas. JWT sudaro trys dalys: antraštė, turinys ir parašas. Parašas yra labai svarbus; jis patikrina, ar prieigos raktą išdavė patikimas serveris ir ar jis nebuvo sugadintas.
Geriausia JWT Įgyvendinimo Praktika:
- Naudokite Stiprų Parašų Algoritmą: Naudokite asimetrinius algoritmus, tokius kaip RS256, o ne simetrinius, tokius kaip HS256. Tai neleidžia su klientu susiduriančiam serveriui turėti slaptąjį raktą, reikalingą prieigos raktams pasirašyti.
- Laikykite Turinį Glaustą: Nelaikykite neskelbtinos informacijos JWT turinyje. Jis yra užkoduotas base64, o ne užšifruotas. Laikykite neskelbtinus duomenis, tokius kaip vartotojo ID, vaidmenys ir prieigos rakto galiojimo laikas.
- Nustatykite Trumpus Galiojimo Laikus: Prieigos raktai turėtų turėti trumpą galiojimo laikotarpį (pvz., 15 minučių). Naudokite ilgalaikį atnaujinimo prieigos raktą, kad gautumėte naujus prieigos raktus nereikalaujant vartotojo vėl prisijungti.
- Saugus Prieigos Rakto Saugojimas: Tai yra labai svarbus ginčytinas klausimas. JWT saugojimas
localStorage
padaro juos pažeidžiamus XSS. Saugiausias būdas yra saugoti juosHttpOnly
,Secure
,SameSite=Strict
slapukuose. Tai neleidžia JavaScript pasiekti prieigos rakto, sušvelninant vagystę per XSS. Atnaujinimo prieigos raktas turėtų būti saugomas tokiu būdu, o trumpalaikis prieigos raktas gali būti laikomas atmintyje.
Autorizacija: Mažiausios Privilegijos Principas
Autorizacija nustato, ką autentifikuotam vartotojui leidžiama daryti. Visada laikykitės Mažiausios Privilegijos Principo: vartotojas turėtų turėti tik minimalų prieigos lygį, reikalingą atlikti savo užduotis.
Įgyvendinimas (Tarpinė Programinė Įranga Node.js/Express):
Įdiekite tarpinę programinę įrangą, kad patikrintumėte vartotojo vaidmenis arba leidimus prieš leisdami pasiekti apsaugotą maršrutą.
function authorizeAdmin(req, res, next) {
// Assuming user information is attached to the request object by an auth middleware
if (req.user && req.user.role === 'admin') {
return next(); // User is an admin, proceed
}
return res.status(403).json({ message: 'Forbidden: Access is denied.' });
}
app.get('/api/admin/dashboard', authenticate, authorizeAdmin, (req, res) => {
// This code will only run if the user is authenticated and is an admin
res.json({ data: 'Welcome to the admin dashboard!' });
});
4 Ramstis: Priklausomybių ir Kūrimo Vamzdyno Apsauga
Jūsų programa yra tokia pat saugi, kaip ir silpniausia jos priklausomybė. Programinės įrangos tiekimo grandinės apsauga nebėra neprivaloma.
Priklausomybių Valdymas ir Auditas
npm ekosistema yra didžiulė, tačiau ji gali būti pažeidžiamumų šaltinis. Aktyvus priklausomybių valdymas yra labai svarbus.
Įgyvendinimo Veiksmai:
- Reguliariai Atlikite Auditą: Naudokite įtaisytus įrankius, tokius kaip
npm audit
arba `yarn audit`, kad nuskaitytumėte žinomus pažeidžiamumus savo priklausomybėse. Integruokite tai į savo CI/CD vamzdyną, kad kūrimai nepavyktų, jei randami didelio sunkumo pažeidžiamumai. - Naudokite Fiksavimo Failus: Visada įsipareigokite savo
package-lock.json
arbayarn.lock
failą. Tai užtikrina, kad kiekvienas kūrėjas ir kūrimo aplinka naudoja tą pačią kiekvienos priklausomybės versiją, užkertant kelią netikėtiems pakeitimams. - Automatizuokite Stebėjimą: Naudokite tokias paslaugas kaip GitHub's Dependabot arba trečiųjų šalių įrankius, tokius kaip Snyk. Šios paslaugos nuolat stebi jūsų priklausomybes ir automatiškai sukuria priėmimo užklausas, kad atnaujintumėte paketus su žinomais pažeidžiamumais.
Statinis Programos Saugos Testavimas (SAST)
SAST įrankiai analizuoja jūsų šaltinio kodą jo nevykdydami, kad rastų galimus saugos trūkumus, tokius kaip pavojingų funkcijų naudojimas, užkoduoti slapti duomenys arba nesaugūs modeliai.
Įgyvendinimas:
- Linteriai su Saugos Papildiniais: Puikus atspirties taškas yra naudoti ESLint su į saugą orientuotais papildiniais, tokiais kaip
eslint-plugin-security
. Tai suteikia realaus laiko atsiliepimus jūsų kodo rengyklėje. - CI/CD Integracija: Integruokite galingesnį SAST įrankį, pvz., SonarQube arba CodeQL, į savo CI/CD vamzdyną. Tai gali atlikti gilesnę analizę kiekvieną kartą, kai keičiamas kodas, ir blokuoti suliejimus, kurie įveda naujų saugos rizikų.
Aplinkos Kintamųjų Apsauga
Niekada, niekada neužkoduokite paslapčių (API raktų, duomenų bazės kredencialų, šifravimo raktų) tiesiogiai savo šaltinio kode. Tai yra dažna klaida, kuri sukelia rimtus pažeidimus, kai kodas netyčia padaromas viešas.
Geriausia Praktika:
- Naudokite
.env
failus vietiniam kūrimui ir įsitikinkite, kad.env
yra įtrauktas į jūsų.gitignore
failą. - Gamyboje naudokite paslapčių valdymo paslaugą, kurią teikia jūsų debesies paslaugų teikėjas (pvz., AWS Secrets Manager, Azure Key Vault, Google Secret Manager) arba specialų įrankį, pvz., HashiCorp Vault. Šios paslaugos teikia saugų saugojimą, prieigos kontrolę ir auditą visoms jūsų paslaptims.
5 Ramstis: Saugus Duomenų Tvarkymas
Šis ramstis orientuotas į duomenų apsaugą, kai jie juda per jūsų sistemą ir kai jie saugomi.
Šifruokite Viską Perdavimo Metu
Visas ryšys tarp kliento ir jūsų serverių bei tarp jūsų vidinių mikroservisų turi būti užšifruotas naudojant Transport Layer Security (TLS), paprastai žinomą kaip HTTPS. Tai yra neprivaloma. Norėdami įgyvendinti šią politiką, naudokite HSTS antraštę, aptartą anksčiau.
API Saugos Geriausia Praktika
- Įvesties Patvirtinimas: Griežtai patvirtinkite visus gaunamus duomenis savo API serveryje. Patikrinkite teisingus duomenų tipus, ilgius, formatus ir diapazonus. Tai apsaugo nuo įvairių atakų, įskaitant NoSQL įpurškimą ir kitas duomenų sugadinimo problemas.
- Normos Ribojimas: Įdiekite normos ribojimą, kad apsaugotumėte savo API nuo paslaugos atsisakymo (DoS) atakų ir žiaurios jėgos bandymų prisijungimo galinėse jungtyse.
- Tinkami HTTP Metodai: Naudokite HTTP metodus pagal jų paskirtį. Naudokite
GET
saugiam, idempotentiniam duomenų gavimui ir naudokitePOST
,PUT
irDELETE
veiksmams, kurie keičia būseną. Niekada nenaudokiteGET
būseną keičiančioms operacijoms.
6 Ramstis: Žurnalų Kūrimas, Stebėjimas ir Reagavimas į Incidentus
Negalite apsiginti nuo to, ko nematote. Patikima žurnalų kūrimo ir stebėjimo sistema yra jūsų saugos nervų sistema, įspėjanti jus apie galimas grėsmes realiu laiku.
Ką Registruoti
- Autentifikavimo bandymai (sėkmingi ir nesėkmingi)
- Autorizacijos gedimai (prieigos atmetimo įvykiai)
- Serverio pusės įvesties patvirtinimo gedimai
- Didelio sunkumo programos klaidos
- CSP pažeidimo ataskaitos
Svarbu, ko NEREGISTRUOTI: Niekada neregistruokite neskelbtinų vartotojo duomenų, tokių kaip slaptažodžiai, seanso prieigos raktai, API raktai arba asmenį identifikuojanti informacija (PII), paprastu tekstu.
Realaus Laiko Stebėjimas ir Įspėjimai
Jūsų žurnalai turėtų būti sujungti į centralizuotą sistemą (pvz., ELK rietuvę – Elasticsearch, Logstash, Kibana – arba tokią paslaugą kaip Datadog arba Splunk). Konfigūruokite prietaisų skydelius, kad vizualizuotumėte pagrindinius saugos rodiklius, ir nustatykite automatinius įspėjimus apie įtartinus modelius, tokius kaip:
- Staigus nesėkmingų prisijungimo bandymų šuolis iš vieno IP adreso.
- Keli autorizacijos gedimai vienai vartotojo paskyrai.
- Didelis skaičius CSP pažeidimo ataskaitų, rodančių galimą XSS ataką.
Turėkite Incidentų Reagavimo Planą
Įvykus incidentui, turėti iš anksto apibrėžtą planą yra labai svarbu. Jame turėtų būti apibrėžti veiksmai, kuriuos reikia atlikti: Identifikuoti, Izoliuoti, Pašalinti, Atkurti ir Išmokti. Su kuo reikia susisiekti? Kaip atšaukiate pažeistus kredencialus? Kaip analizuojate pažeidimą, kad užkirstumėte kelią jam pasikartoti? Pagalvoti apie šiuos klausimus prieš įvykstant incidentui yra nepalyginamai geriau nei improvizuoti krizės metu.
Išvada: Saugumo Kultūros Puoselėjimas
JavaScript saugos infrastruktūros įgyvendinimas nėra vienkartinis projektas; tai nuolatinis procesas ir kultūrinis mąstymas. Šeši ramsčiai, aprašyti čia – Naršyklės Gynyba, Saugus Programavimas, AuthN/AuthZ, Priklausomybių Saugumas, Saugus Duomenų Tvarkymas ir Stebėjimas – sudaro holistinį pagrindą kuriant atsparias ir patikimas programas.
Saugumas yra bendra atsakomybė. Tam reikia kūrėjų, operacijų ir saugos komandų bendradarbiavimo – praktikos, žinomos kaip DevSecOps. Integruodami saugą į kiekvieną programinės įrangos kūrimo gyvavimo ciklo etapą – nuo projektavimo ir programavimo iki diegimo ir operacijų – galite pereiti nuo reaktyvios saugos pozicijos prie aktyvios.
Skaitmeninis kraštovaizdis toliau vystysis ir atsiras naujų grėsmių. Tačiau, remdamiesi šiuo tvirtu, daugiasluoksniu pagrindu, būsite gerai pasirengę apsaugoti savo programas, savo duomenis ir savo vartotojus. Pradėkite statyti savo JavaScript saugos tvirtovę šiandien.